package com.kltn.zigo.process;

import java.util.Arrays;

public class AccentRemover {
		private static char[] SPECIAL_CHARACTERS = { ' ', '!', '"', '#', '$', '%', 
	        '*', '+', ',', '.', ':', '<', '=', '>', '?', '@', '[', '\\', ']', '^', 
	        '`', '|', '~', 'À', 'Á', 'Â', 'Ã', 'È', 'É', 'Ê', 'Ì', 'Í', 'Ò', 
	        'Ó', 'Ô', 'Õ', 'Ù', 'Ú', 'Ý', 'à', 'á', 'â', 'ã', 'è', 'é', 'ê',
	        'ì', 'í', 'ò', 'ó', 'ô', 'õ', 'ù', 'ú', 'ý', 'Ă', 'ă', 'Đ', 'đ',
	        'Ĩ', 'ĩ', 'Ũ', 'ũ', 'Ơ', 'ơ', 'Ư', 'ư', 'Ạ', 'ạ', 'Ả', 'ả', 'Ấ',
	        'ấ', 'Ầ', 'ầ', 'Ẩ', 'ẩ', 'Ẫ', 'ẫ', 'Ậ', 'ậ', 'Ắ', 'ắ', 'Ằ', 'ằ',
	        'Ẳ', 'ẳ', 'Ẵ', 'ẵ', 'Ặ', 'ặ', 'Ẹ', 'ẹ', 'Ẻ', 'ẻ', 'Ẽ', 'ẽ', 'Ế',
	        'ế', 'Ề', 'ề', 'Ể', 'ể', 'Ễ', 'ễ', 'Ệ', 'ệ', 'Ỉ', 'ỉ', 'Ị', 'ị',
	        'Ọ', 'ọ', 'Ỏ', 'ỏ', 'Ố', 'ố', 'Ồ', 'ồ', 'Ổ', 'ổ', 'Ỗ', 'ỗ', 'Ộ',
	        'ộ', 'Ớ', 'ớ', 'Ờ', 'ờ', 'Ở', 'ở', 'Ỡ', 'ỡ', 'Ợ', 'ợ', 'Ụ', 'ụ',
	        'Ủ', 'ủ', 'Ứ', 'ứ', 'Ừ', 'ừ', 'Ử', 'ử', 'Ữ', 'ữ', 'Ự', 'ự', 
	        'Ỵ', 'ỵ','Ỷ', 'ỷ', 'Ý', 'ý', 'Ỳ', 'ỳ', 'Ỹ', 'ỹ',};
	
	private static char[] REPLACEMENTS = { '+', '\0', '\0', '\0', '\0', '\0', 
	        '\0', '_', '\0', '\0', '_', '\0', '\0', '\0', '\0', '\0', '\0', '_','\0', '\0', 
	        '\0', '\0', '\0', 'a', 'a', 'a', 'a', 'e', 'e', 'e', 'i', 'i', 'o',
	        'o', 'o', 'o', 'u', 'u', 'y', 'a', 'a', 'a', 'a','e', 'e', 'e', 
	        'i', 'i', 'o', 'o', 'o', 'o', 'u', 'u', 'y', 'A', 'a', 'd', 'd', 
	        'i', 'i', 'u', 'u', 'o', 'o', 'u', 'u', 'a', 'a', 'a', 'a', 'a', 
	        'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',
	        'a', 'a', 'a', 'a', 'a', 'a', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 
	        'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i',
	        'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o',
	        'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u',
	        'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 
	        'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y',};
	
	private static char[] SPECIAL_CHARACTERS2 = { '!', '"', '#', '$', '%', 
			'*', '+', ',', '.', ':', '<', '=', '>', '?', '@', '[', '\\', ']', '^', 
			'`', '|', '~', 'À', 'Á', 'Â', 'Ã', 'È', 'É', 'Ê', 'Ì', 'Í', 'Ò', 
			'Ó', 'Ô', 'Õ', 'Ù', 'Ú', 'Ý', 'à', 'á', 'â', 'ã', 'è', 'é', 'ê',
			'ì', 'í', 'ò', 'ó', 'ô', 'õ', 'ù', 'ú', 'ý', 'Ă', 'ă', 'Đ', 'đ',
			'Ĩ', 'ĩ', 'Ũ', 'ũ', 'Ơ', 'ơ', 'Ư', 'ư', 'Ạ', 'ạ', 'Ả', 'ả', 'Ấ',
			'ấ', 'Ầ', 'ầ', 'Ẩ', 'ẩ', 'Ẫ', 'ẫ', 'Ậ', 'ậ', 'Ắ', 'ắ', 'Ằ', 'ằ',
			'Ẳ', 'ẳ', 'Ẵ', 'ẵ', 'Ặ', 'ặ', 'Ẹ', 'ẹ', 'Ẻ', 'ẻ', 'Ẽ', 'ẽ', 'Ế',
			'ế', 'Ề', 'ề', 'Ể', 'ể', 'Ễ', 'ễ', 'Ệ', 'ệ', 'Ỉ', 'ỉ', 'Ị', 'ị',
			'Ọ', 'ọ', 'Ỏ', 'ỏ', 'Ố', 'ố', 'Ồ', 'ồ', 'Ổ', 'ổ', 'Ỗ', 'ỗ', 'Ộ',
			'ộ', 'Ớ', 'ớ', 'Ờ', 'ờ', 'Ở', 'ở', 'Ỡ', 'ỡ', 'Ợ', 'ợ', 'Ụ', 'ụ',
			'Ủ', 'ủ', 'Ứ', 'ứ', 'Ừ', 'ừ', 'Ử', 'ử', 'Ữ', 'ữ', 'Ự', 'ự', 
			'Ỵ', 'ỵ','Ỷ', 'ỷ', 'Ý', 'ý', 'Ỳ', 'ỳ', 'Ỹ', 'ỹ',};
	
	private static char[] REPLACEMENTS2 = { '\0', '\0', '\0', '\0', '\0', 
			'\0', '_', '\0', '\0', '_', '\0', '\0', '\0', '\0', '\0', '\0', '_','\0', '\0', 
			'\0', '\0', '\0', 'a', 'a', 'a', 'a', 'e', 'e', 'e', 'i', 'i', 'o',
			'o', 'o', 'o', 'u', 'u', 'y', 'a', 'a', 'a', 'a','e', 'e', 'e', 
			'i', 'i', 'o', 'o', 'o', 'o', 'u', 'u', 'y', 'A', 'a', 'd', 'd', 
			'i', 'i', 'u', 'u', 'o', 'o', 'u', 'u', 'a', 'a', 'a', 'a', 'a', 
			'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',
			'a', 'a', 'a', 'a', 'a', 'a', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 
			'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i',
			'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o',
			'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u',
			'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 
			'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y',};
	        
	
	public static String toUrlFriendly(String s) {
		//s = s.trim();
		s = ChuanHoaDau(s);
		int maxLength = Math.min(s.length(), 236);
		char[] buffer = new char[maxLength];
		int n = 0;
		for (int i = 0; i < maxLength; i++) {
		        char ch = s.charAt(i);
		        buffer[n] = removeAccent(ch);
		        // skip not printable characters
		        if (buffer[n] > 31) {
		                n++;
		        }
		}
		// skip trailing slashes
		while (n > 0 && buffer[n - 1] == '/') {
		        n--;
		}
		return ChuanHoaSau(String.valueOf(buffer, 0, n).toLowerCase());
	}
	
	public static String toRemoveVNese(String s) {
		//s = s.trim();
		s = ChuanHoaDau(s);
		int maxLength = Math.min(s.length(), 236);
		char[] buffer = new char[maxLength];
		int n = 0;
		for (int i = 0; i < maxLength; i++) {
		    char ch = s.charAt(i);
		    buffer[n] = removeAccentVNese(ch);
		    // skip not printable characters
		    if (buffer[n] > 31) {
		            n++;
		    }
		}
		// skip trailing slashes
		while (n > 0 && buffer[n - 1] == '/') {
		    n--;
		}
		return ChuanHoaDau(String.valueOf(buffer, 0, n).toLowerCase().trim());
	}
	
	public static char removeAccentVNese(char ch) {
		int index = Arrays.binarySearch(SPECIAL_CHARACTERS2, ch);
		if (index >= 0) {
		    ch = REPLACEMENTS2[index];
		}
		return ch;
		}
		
	public static char removeAccent(char ch) {
		int index = Arrays.binarySearch(SPECIAL_CHARACTERS, ch);
		if (index >= 0) {
		        ch = REPLACEMENTS[index];
		}
		return ch;
	}
	
	public static String removeAccent(String s) {
		StringBuilder sb = new StringBuilder(s);
		for (int i = 0; i < sb.length(); i++) {
		        sb.setCharAt(i, removeAccent(sb.charAt(i)));
		}
		return sb.toString().toLowerCase();
	}
	
	public static String ChuanHoaDau(String s) 
	{ 
		int space = 0; 
		// Duyet het chuoi 
		for (int i = 0; i < s.length(); i++) 
		{ 
		if (s.charAt(i) == ' ') 
		    space++; // Tim duoc space 
		else 
		space = 0; // Quay lai 1 tu moi khi ket thuc space 
		if (space > 1) 
		{ 
		    space = 0; 
		    do 
		    { 
		        if (s.charAt(i) == ' ') 
		            s = s.replace("  ", " "); 
		    } while (s.charAt(i) == ' '); 
		} 
		} 
		s = s.trim(); // Xóa khoảng trắng đầu và cuối 
		return s;
	}
	
	public static String ChuanHoaSau(String s) 
	{ 
		int space = 0; 
		// Duyet het chuoi 
		for (int i = 0; i < s.length(); i++) 
		{ 
		if (s.charAt(i) == '+') 
		    space++; // Tim duoc space 
		else 
		space = 0; // Quay lai 1 tu moi khi ket thuc space 
		if (space > 1) 
		{ 
		    space = 0; 
		    do 
		    { 
		        if (s.charAt(i) == '+') 
		            s = s.replace("++", "+"); 
		    } while (s.charAt(i) == '+'); 
		} 
		} 
		s = s.trim(); // Xóa khoảng trắng đầu và cuối 
		return s;
	}
}
